package com.cuvretool.bezier;

import java.util.ArrayList;

import com.cuvretool.Base;
import com.cuvretool.utils.Vector2;

/**
 * 多介Beizier曲线计算
 * since 2015年4月12日 下午4:01:42
 * @author boy
 */
public class Bezier implements Base{
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================
	/**Bezier曲线计算点*/
	private ArrayList<Vector2> mPostions;
	/**该条Bezier的取点数*/
	private int mCounts;
	/**Bezier采样点集*/
	private ArrayList<Vector2> mResulte;
	// ===========================================================
	// Constructors
	// ===========================================================
	public Bezier(){
		init();
	}
	// ===========================================================
	// Getter & Setter
	// ===========================================================
	/**
	 * 获取当前Bezier计算点
	 * @return
	 */
	public ArrayList<Vector2> getPostions() {
		return mPostions;
	}
	/**
	 * 设置Bezier计算点,设置失败，则维持上一次结果
	 * @param postions
	 */
	public void setPostions(ArrayList<Vector2> postions) {
		if(postions == null){
			new Throwable("Bezier mPostions can't be null");
			return;
		}
		this.mPostions.clear();
		this.mPostions.addAll(postions);
	}
	/**
	 * 获取曲线采样点数
	 * @return
	 */
	public int getCounts() {
		return mCounts;
	}
	/**
	 * 设置曲线采样点数
	 * @param counts
	 */
	public void setCounts(int counts) {
		this.mCounts = counts;
		if(mCounts < 2){
			new Throwable("counts can't be this number");
			mCounts = 2;
		}
	}
	/**
	 *  获取采样点集
	 * @return
	 */
	public ArrayList<Vector2> getResulte() {
		return mResulte;
	}
	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================
	@Override
	public void init() {
		mPostions = new ArrayList<Vector2>();
		mResulte = new ArrayList<Vector2>();
		mCounts = 150;
	}
	/**
	 * 更新采样曲线
	 */
	@Override
	public void run() {
		mResulte.clear();
		for (int i = 0; i < mCounts; i++) {
			float t = (i*1.0f)/((mCounts-1)*1.0f);
			Vector2 result = getInterpolator(mPostions, t);
			mResulte.add(result);
		}
	}
	@Override
	public void over() {
		mPostions.clear();
		mPostions = null;
		mResulte.clear();
		mResulte = null;
	}
	// ===========================================================
	// Methods
	// ===========================================================
	/**
	 * [0,1]比值范围内计算Bezier曲线点
	 * @param postions		当前执行的点集
	 * @param proportion	比值
	 * @return				曲线对应的点坐标
	 */
	private Vector2 getInterpolator(ArrayList<Vector2> postions, float proportion){
		Vector2 result = new Vector2();
		int number = postions.size();
		if(number == 0){
			result.set(0, 0);
		} else if(number == 1){
			result.set(postions.get(0));
		} else {
			ArrayList<Vector2> temp = new ArrayList<Vector2>();
			for (int i = 0; i < postions.size()-1; i++) {
				Vector2 vec1 = postions.get(i);
				Vector2 vec2 = postions.get(i+1);
				Vector2 pos =new Vector2();
				pos.x = (vec2.x-vec1.x)*proportion + vec1.x;
				pos.y = (vec2.y-vec1.y)*proportion + vec1.y;
				temp.add(pos);
			}
			result.set(getInterpolator(temp,proportion));
		}
		return result;
	}
	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}
